﻿using System;
using System.Xml;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using Microsoft.Ink;
using ICSharpCode.SharpZipLib.Zip;
using Modele;
using System.IO;


namespace Sauvegarde
{
    class reader1
    {

        Modele.Modele m;

        public reader1(Modele.Modele mod)
        {
            m = mod;
        }

        static Microsoft.Ink.Ink lireDansPan(String zip, String fichierARecuperer)
        {
            Microsoft.Ink.Ink encre = new Microsoft.Ink.Ink();
            using (ZipInputStream s = new ZipInputStream(File.OpenRead(zip)))
            {
                EnregistrementPAN ep = new EnregistrementPAN();
                ZipEntry theEntry;
                while ((theEntry = s.GetNextEntry()) != null)
                {
                    String fichierRecupere = theEntry.Name;
                    if (fichierARecuperer.Equals(fichierRecupere))
                    {
                        encre = ep.Ouverture(fichierRecupere);
                    }
                }
                return encre;
            }
        }

        public void lireUPX(String cheminAbs)
        {
            String chemin = ManipulationChaine.extension(cheminAbs);
            String nomFichier = ManipulationChaine.fichierPan(cheminAbs);

            //ProjetBlocNote nouvProjet = new ProjetBlocNote();

            using (ZipInputStream s = new ZipInputStream(File.OpenRead("" + chemin + "\\" + nomFichier)))
            {
                ZipEntry theEntry;
                while ((theEntry = s.GetNextEntry()) != null)
                {
                    String fichierRecupere = theEntry.Name;
                    if (fichierRecupere.Equals("sauvegarde.xml"))
                    {

                        // Create an isntance of XmlTextReader and call Read method to read the file

                        XmlTextReader textReader = new XmlTextReader("" + chemin + "\\sauvegarde.xml");

                        textReader.Read();

                        // Move to first element
                        textReader.MoveToElement();

                        // If the node has value

                        while (textReader.Read())
                        {

                            //String url_img = "";


                            // nom du noeud
                            string name = textReader.Name; //nom du noeud courant
                            int indiceCalqueCourant = 0; //le numéro du calque courant
                            int indiceCoucheCourante = 0; // le numéro de la couche courante

                            /*
                            if (name.Equals("Image"))
                            {
                                textReader.MoveToAttribute("url_image");
                                url_img = textReader.Value;

                            }

                            if (!url_img.Equals("")) 
                            {
                                //création d'une nouvelle instance de projet
                                nouvProjet = new ProjetBlocNote(url_img);
                            }
                            */



                            if (name.Equals("nbPages")) // le nombre de pages du projet
                            {
                                
                                textReader.MoveToAttribute("nb");
                                int n = Convert.ToInt32(textReader.Value);
                                textReader.MoveToElement();
                                m.getProjet().setNbPages(n);
                            }

                            if (name.Equals("couche"))
                            {
                                textReader.MoveToAttribute("idcouche");
                                indiceCoucheCourante = Convert.ToInt32(textReader.Value);
                                textReader.MoveToElement();

                                textReader.MoveToAttribute("visibiliteCouche");
                                string visib = textReader.Value;
                                textReader.MoveToElement();
                                if (visib.Equals("non"))//visibilité à vrai par défaut donc traitement que si non visible
                                {
                                    m.getProjet().accesCoucheInd(indiceCoucheCourante).changerVisibilite();
                                }

                                if (name.Equals("calque"))
                                {
                                    m.getProjet().ajouterCalque();
                                    textReader.MoveToAttribute("idcalque");
                                    indiceCalqueCourant = Convert.ToInt32(textReader.Value);

                                    textReader.MoveToAttribute("url_calque");
                                    String url_calque = textReader.Value;
                                    //EnregistrementPAN enre = new EnregistrementPAN();
                                    ((Calque)m.getProjet().accesCoucheInd(indiceCoucheCourante).couche[indiceCalqueCourant]).encre
                                        //    = enre.Ouverture(url_calque);
                                          = lireDansPan(""+chemin+"\\"+nomFichier, url_calque);
                                    textReader.MoveToElement();
                                }


                                //voir par rapport à l'association avec l'image
                                if (name.Equals("balise"))
                                {
                                    textReader.Read();
                                    name = textReader.Name;

                                    textReader.MoveToAttribute("url_icone_balise");
                                    String url_icone_balise = textReader.Value;
                                    textReader.MoveToElement();

                                    int x = 0;
                                    int y = 0;

                                    if (name.Equals("position"))
                                    {
                                        textReader.MoveToAttribute("positionX");
                                        x = Convert.ToInt32(textReader.Value);
                                        textReader.MoveToElement();
                                        textReader.MoveToAttribute("positionY");
                                        y = Convert.ToInt32(textReader.Value);
                                        textReader.MoveToElement();
                                    }

                                    string prenom = "";
                                    string nom = "";
                                    textReader.Read();
                                    name = textReader.Name;
                                    if (name.Equals("auteur"))
                                    {
                                        textReader.MoveToAttribute("prenom");
                                        prenom = textReader.Value;
                                        textReader.MoveToElement();
                                        textReader.MoveToAttribute("nom");
                                        nom = textReader.Value;
                                        textReader.MoveToElement();
                                    }


                                    textReader.Read(); //noeud label
                                    name = textReader.Name;
                                    if (name.Equals("label"))
                                    {
                                        textReader.Read(); // noeud alternate
                                        name = textReader.Name;

                                        string sem = "";
                                        if (name.Equals("alternate"))
                                        {
                                            sem = textReader.Value.ToString();
                                        }


                                        Position p = new Position(x, y);
                                        Semantique semt = new Semantique(sem);
                                        //AnnotationPAN ann = new AnnotationPAN(p, s);
                                        Balise bal = new Balise(p, semt, url_icone_balise,prenom,nom);

                                        ((Calque)m.getProjet().accesCoucheInd(indiceCoucheCourante).couche[indiceCalqueCourant]).add(bal);
                                    }
                                }

                                if (name.Equals("texte"))
                                {
                                    textReader.Read();
                                    name = textReader.Name;

                                    textReader.MoveToAttribute("att_texte");
                                    String tex = textReader.Value;

                                    int x = 0;
                                    int y = 0;

                                    if (textReader.Name.Equals("position"))
                                    {
                                        textReader.MoveToAttribute("positionX");
                                        x = Convert.ToInt32(textReader.Value);
                                        textReader.MoveToElement();
                                        textReader.MoveToAttribute("positionY");
                                        y = Convert.ToInt32(textReader.Value);
                                        textReader.MoveToElement();
                                    }

                                    textReader.Read(); //noeud label
                                    name = textReader.Name;
                                    if (name.Equals("label"))
                                    {
                                        textReader.Read(); // noeud alternate
                                        name = textReader.Name;

                                        string sem = "";
                                        if (name.Equals("alternate"))
                                        {
                                            sem = textReader.Value.ToString();
                                        }


                                        Position p = new Position(x, y);
                                        Semantique semt = new Semantique(sem);
                                        //AnnotationPAN ann = new AnnotationPAN(p, s);
                                        Texte text1 = new Texte(p, semt, tex);
                                        ((Calque)m.getProjet().accesCoucheInd(indiceCoucheCourante).couche[indiceCalqueCourant]).add(text1);

                                    }
                                }
                            }
                        }
                    }
                }
            }
            //m.setProjet(nouvProjet);
        }
    }
}



                    //consignes générales pour écrire des xml (à supprimer une fois fini)

                    // si nombre d'attribut dans le noeud différent de 0

                    /*   if (textReader.HasAttributes)
                       {
                           for (int i = 0; i < textReader.AttributeCount; i++)
                           {
                               textReader.MoveToAttribute(i);
                               Console.WriteLine(" " + textReader.Name + "=" + textReader.Value.ToString());
                           }
                           textReader.MoveToElement(); // Moves the reader back to the element node.
                       }


                       //pour les noeuds alternate
                       Console.WriteLine("Value:" + textReader.Value.ToString()); //valeur entre balise ouvrante et fermante

                       //accès à un attribut particulier d'un noeud
                       if (textReader.HasAttributes)
                       {
                           Console.WriteLine("Attribute id of <" + textReader.Name + ">");
                           textReader.MoveToAttribute("id");
                           Console.WriteLine("id:" + textReader.Value.ToString());
                           textReader.MoveToElement();
                       }

                       //parcours de tous les attributs du noeud
                       if (textReader.HasAttributes)
                       {
                           Console.WriteLine("Attributes of <" + textReader.Name + ">");
                           for (int i = 0; i < textReader.AttributeCount; i++)
                           {
                               textReader.MoveToAttribute(i);
                               Console.WriteLine(" " + textReader.Name + "=" + textReader.Value.ToString());
                           }
                           textReader.MoveToElement(); // Moves the reader back to the element node.
                       }
                   }
                   Console.ReadLine();
               }*/
